// 抽象类：包含抽象方法（抽象方法一般没有任何的具体内容的实现），也可以包含实例方法，抽象类时不饿能被实例化，为了让子类进行实例化及实现内部的抽象方法
// 抽象类的目的或者是作用最终都是为子类服务的
(() => {
    abstract class Animal {
        abstract name: string
        abstract eat()
        // 抽象方法
        // 报错，抽象方法不能有具体的实现
        // abstract eat() {
        //     console.log('你好')
        // }
        sayHi() {
            console.log('你好')
        }
    }
    // 定义一个子类
    class Dog extends Animal {
        name: string = '小黄'
        // 重新实现抽象类中的方法，此时这个方法就是当前Dog类的实例方法了
        eat() {
            console.log('好吃');
        }
    }
    // 不能实例化抽象类的对象
    // const ani: Animal = new Animal()

    // 实例化dog对象
    const dog: Dog = new Dog()
    dog.eat()
    // 调用的时抽象类的实例方法
    dog.sayHi()
    console.log(dog.name);

})()